blob: 4df0ab8a4a1c2f960087029e6ae5c858ba545352 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Robert Bosch GmbH
* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
using BaSyx.API.AssetAdministrationShell.Extensions;
using BaSyx.Models.Connectivity.Descriptors;
using BaSyx.Models.Core.AssetAdministrationShell.Generics;
using BaSyx.Models.Core.Common;
using BaSyx.Utils.ResultHandling;
using System;
using System.Collections.Generic;
using System.Linq;
namespace BaSyx.API.Components
{
public class AssetAdministrationShellAggregatorServiceProvider : IAssetAdministrationShellAggregatorServiceProvider
{
public IEnumerable<IAssetAdministrationShell> AssetAdministrationShells => GetBinding();
private Dictionary<string, IAssetAdministrationShellServiceProvider> AssetAdministrationShellServiceProviders { get; }
private IAssetAdministrationShellAggregatorDescriptor _serviceDescriptor;
public IAssetAdministrationShellAggregatorDescriptor ServiceDescriptor
{
get
{
if (_serviceDescriptor == null)
_serviceDescriptor = new AssetAdministrationShellAggregatorDescriptor(AssetAdministrationShells, null);
return _serviceDescriptor;
}
private set
{
_serviceDescriptor = value;
}
}
public AssetAdministrationShellAggregatorServiceProvider(IAssetAdministrationShellAggregatorDescriptor descriptor) : this()
{
ServiceDescriptor = descriptor;
}
public AssetAdministrationShellAggregatorServiceProvider()
{
AssetAdministrationShellServiceProviders = new Dictionary<string, IAssetAdministrationShellServiceProvider>();
}
public void BindTo(IEnumerable<IAssetAdministrationShell> assetAdministrationShells)
{
foreach (var assetAdministrationShell in assetAdministrationShells)
{
RegisterAssetAdministrationShellServiceProvider(assetAdministrationShell.IdShort, assetAdministrationShell.CreateServiceProvider(true));
}
ServiceDescriptor = ServiceDescriptor ?? new AssetAdministrationShellAggregatorDescriptor(assetAdministrationShells, null);
}
public IEnumerable<IAssetAdministrationShell> GetBinding()
{
IEnumerable<IAssetAdministrationShellServiceProvider> serviceProviders = GetAssetAdministrationShellServiceProviders();
List<IAssetAdministrationShell> assetAdministrationShells = new List<IAssetAdministrationShell>();
foreach (var serviceProvider in serviceProviders)
{
IAssetAdministrationShell binding = serviceProvider.GetBinding();
assetAdministrationShells.Add(binding);
}
return assetAdministrationShells;
}
public IResult<IAssetAdministrationShell> CreateAssetAdministrationShell(IAssetAdministrationShell aas)
{
if (aas == null)
return new Result<IAssetAdministrationShell>(new ArgumentNullException(nameof(aas)));
RegisterAssetAdministrationShellServiceProvider(aas.IdShort, aas.CreateServiceProvider(true));
IAssetAdministrationShellServiceProvider serviceProvider = GetAssetAdministrationShellServiceProvider(aas.IdShort);
if (serviceProvider != null && serviceProvider.GetBinding() != null)
return new Result<IAssetAdministrationShell>(true, serviceProvider.GetBinding());
else
return new Result<IAssetAdministrationShell>(false, new Message(MessageType.Error, "Could not retrieve Asset Administration Shell Service Provider"));
}
public IResult DeleteAssetAdministrationShell(string aasId)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IAssetAdministrationShell>(new ArgumentNullException(nameof(aasId)));
UnregisterAssetAdministrationShellServiceProvider(aasId);
return new Result(true);
}
public IAssetAdministrationShellServiceProvider GetAssetAdministrationShellServiceProvider(string id)
{
if (AssetAdministrationShellServiceProviders.TryGetValue(id, out IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider))
return assetAdministrationShellServiceProvider;
else
return null;
}
public IEnumerable<IAssetAdministrationShellServiceProvider> GetAssetAdministrationShellServiceProviders()
{
return AssetAdministrationShellServiceProviders?.Values.ToList();
}
public void RegisterAssetAdministrationShellServiceProvider(string id, IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider)
{
if (!AssetAdministrationShellServiceProviders.ContainsKey(id))
AssetAdministrationShellServiceProviders.Add(id, assetAdministrationShellServiceProvider);
}
public void UnregisterAssetAdministrationShellServiceProvider(string id)
{
if (!AssetAdministrationShellServiceProviders.ContainsKey(id))
AssetAdministrationShellServiceProviders.Remove(id);
}
public IResult<IAssetAdministrationShell> RetrieveAssetAdministrationShell(string aasId)
{
IAssetAdministrationShellServiceProvider serviceProvider = GetAssetAdministrationShellServiceProvider(aasId);
if(serviceProvider != null && serviceProvider.GetBinding() != null)
{
IAssetAdministrationShell binding = serviceProvider.GetBinding();
return new Result<IAssetAdministrationShell>(true, binding);
}
return new Result<IAssetAdministrationShell>(false, new NotFoundMessage("Asset Administration Shell Service Provider"));
}
public IResult<IElementContainer<IAssetAdministrationShell>> RetrieveAssetAdministrationShells()
{
return new Result<IElementContainer<IAssetAdministrationShell>>(true, new ElementContainer<IAssetAdministrationShell>(AssetAdministrationShells));
}
public IResult UpdateAssetAdministrationShell(string aasId, IAssetAdministrationShell aas)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IAssetAdministrationShell>(new ArgumentNullException(nameof(aasId)));
if (aas == null)
return new Result<IAssetAdministrationShell>(new ArgumentNullException(nameof(aas)));
return CreateAssetAdministrationShell(aas);
}
}
}