blob: 04c4363eba1c68e16adbe961eb652b5b1b0c4f0d [file] [log] [blame]
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +02001/*******************************************************************************
2* Copyright (c) 2020 Robert Bosch GmbH
3* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
4*
5* This program and the accompanying materials are made available under the
6* terms of the Eclipse Public License 2.0 which is available at
7* http://www.eclipse.org/legal/epl-2.0
8*
9* SPDX-License-Identifier: EPL-2.0
10*******************************************************************************/
11using BaSyx.API.AssetAdministrationShell.Extensions;
12using BaSyx.Models.Connectivity.Descriptors;
13using BaSyx.Models.Core.AssetAdministrationShell.Generics;
14using BaSyx.Models.Core.Common;
15using BaSyx.Utils.ResultHandling;
16using System;
17using System.Collections.Generic;
18using System.Linq;
19
20namespace BaSyx.API.Components
21{
22 public class SubmodelRepositoryServiceProvider : ISubmodelRepositoryServiceProvider
23 {
24 public IEnumerable<ISubmodel> Submodels => GetBinding();
25
26 private Dictionary<string, ISubmodelServiceProvider> SubmodelServiceProviders { get; }
27
28 private ISubmodelRepositoryDescriptor _serviceDescriptor;
29 public ISubmodelRepositoryDescriptor ServiceDescriptor
30 {
31 get
32 {
33 if (_serviceDescriptor == null)
34 _serviceDescriptor = new SubmodelRepositoryDescriptor(Submodels, null);
35
36 return _serviceDescriptor;
37 }
38 private set
39 {
40 _serviceDescriptor = value;
41 }
42 }
43 public SubmodelRepositoryServiceProvider(ISubmodelRepositoryDescriptor descriptor) : this()
44 {
45 ServiceDescriptor = descriptor;
46 }
47
48 public SubmodelRepositoryServiceProvider()
49 {
50 SubmodelServiceProviders = new Dictionary<string, ISubmodelServiceProvider>();
51 }
52
53 public void BindTo(IEnumerable<ISubmodel> submodels)
54 {
55 foreach (var submodel in submodels)
56 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +010057 RegisterSubmodelServiceProvider(submodel.Identification.Id, submodel.CreateServiceProvider());
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020058 }
59 ServiceDescriptor = ServiceDescriptor ?? new SubmodelRepositoryDescriptor(submodels, null);
60 }
61 public IEnumerable<ISubmodel> GetBinding()
62 {
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020063 List<ISubmodel> submodels = new List<ISubmodel>();
Constantin Ziescheeb74d642020-11-04 17:57:12 +010064 var retrievedSubmodelServiceProviders = GetSubmodelServiceProviders();
65 if (retrievedSubmodelServiceProviders.TryGetEntity(out IEnumerable<ISubmodelServiceProvider> serviceProviders))
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020066 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +010067 foreach (var serviceProvider in serviceProviders)
68 {
69 ISubmodel binding = serviceProvider.GetBinding();
70 submodels.Add(binding);
71 }
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020072 }
73 return submodels;
74 }
75
76 public IResult<ISubmodel> CreateSubmodel(ISubmodel submodel)
77 {
78 if (submodel == null)
79 return new Result<ISubmodel>(new ArgumentNullException(nameof(submodel)));
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020080
Constantin Ziescheeb74d642020-11-04 17:57:12 +010081 var registered = RegisterSubmodelServiceProvider(submodel.Identification.Id, submodel.CreateServiceProvider());
82 if (!registered.Success)
83 return new Result<ISubmodel>(registered);
84
85 var retrievedSubmodelServiceProvider = GetSubmodelServiceProvider(submodel.Identification.Id);
86 if (retrievedSubmodelServiceProvider.TryGetEntity(out ISubmodelServiceProvider serviceProvider))
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020087 return new Result<ISubmodel>(true, serviceProvider.GetBinding());
88 else
89 return new Result<ISubmodel>(false, new Message(MessageType.Error, "Could not retrieve Submodel Service Provider"));
90 }
91
92 public IResult DeleteSubmodel(string submodelId)
93 {
94 if (string.IsNullOrEmpty(submodelId))
95 return new Result<ISubmodel>(new ArgumentNullException(nameof(submodelId)));
Constantin Ziescheeb74d642020-11-04 17:57:12 +010096 return UnregisterSubmodelServiceProvider(submodelId);
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +020097 }
98
Constantin Ziescheeb74d642020-11-04 17:57:12 +010099 public IResult<ISubmodelServiceProvider> GetSubmodelServiceProvider(string id)
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200100 {
101 if (SubmodelServiceProviders.TryGetValue(id, out ISubmodelServiceProvider submodelServiceProvider))
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100102 return new Result<ISubmodelServiceProvider>(true, submodelServiceProvider);
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200103 else
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100104 return new Result<ISubmodelServiceProvider>(false, new NotFoundMessage(id));
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200105 }
106
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100107 public IResult<IEnumerable<ISubmodelServiceProvider>> GetSubmodelServiceProviders()
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200108 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100109 if (SubmodelServiceProviders.Values == null)
110 return new Result<IEnumerable<ISubmodelServiceProvider>>(false, new NotFoundMessage("Submodel Service Providers"));
111
112 return new Result<IEnumerable<ISubmodelServiceProvider>>(true, SubmodelServiceProviders.Values?.ToList());
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200113 }
114
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100115 public IResult<ISubmodelDescriptor> RegisterSubmodelServiceProvider(string id, ISubmodelServiceProvider submodelServiceProvider)
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200116 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100117 if (SubmodelServiceProviders.ContainsKey(id))
118 SubmodelServiceProviders[id] = submodelServiceProvider;
119 else
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200120 SubmodelServiceProviders.Add(id, submodelServiceProvider);
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100121
122 return new Result<ISubmodelDescriptor>(true, submodelServiceProvider.ServiceDescriptor);
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200123 }
124
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100125 public IResult UnregisterSubmodelServiceProvider(string id)
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200126 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100127 if (SubmodelServiceProviders.ContainsKey(id))
128 {
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200129 SubmodelServiceProviders.Remove(id);
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100130 return new Result(true);
131 }
132 else
133 return new Result(false, new NotFoundMessage(id));
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200134 }
135
136 public IResult<ISubmodel> RetrieveSubmodel(string submodelId)
137 {
Constantin Ziescheeb74d642020-11-04 17:57:12 +0100138 var retrievedSubmodelServiceProvider = GetSubmodelServiceProvider(submodelId);
139 if(retrievedSubmodelServiceProvider.TryGetEntity(out ISubmodelServiceProvider serviceProvider))
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200140 {
141 ISubmodel binding = serviceProvider.GetBinding();
142 return new Result<ISubmodel>(true, binding);
143 }
144 return new Result<ISubmodel>(false, new NotFoundMessage("Submodel Service Provider"));
145 }
146
147 public IResult<IElementContainer<ISubmodel>> RetrieveSubmodels()
148 {
Constantin Ziesche08215502020-09-21 19:08:32 +0200149 return new Result<IElementContainer<ISubmodel>>(true, new ElementContainer<ISubmodel>(null, Submodels));
Constantin Ziesche8b4a64d2020-06-25 11:52:09 +0200150 }
151
152 public IResult UpdateSubmodel(string submodelId, ISubmodel submodel)
153 {
154 if (string.IsNullOrEmpty(submodelId))
155 return new Result<ISubmodel>(new ArgumentNullException(nameof(submodelId)));
156 if (submodel == null)
157 return new Result<ISubmodel>(new ArgumentNullException(nameof(submodel)));
158 return CreateSubmodel(submodel);
159 }
160 }
161}