blob: 050c4be912b4e99c6c226a7558bfca107661ab0f [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.Components;
using BaSyx.Models.Connectivity.Descriptors;
using BaSyx.Models.Core.Common;
using BaSyx.Utils.Client.Http;
using BaSyx.Utils.DependencyInjection;
using BaSyx.Utils.ResultHandling;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
namespace BaSyx.Registry.Client.Http
{
public class RegistryHttpClient : SimpleHttpClient, IAssetAdministrationShellRegistry
{
private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
public RegistryClientSettings Settings { get; }
public const string REGISTRY_BASE_PATH = "api/v1/registry";
public const string SUBMODEL_PATH = "submodels";
public const string PATH_SEPERATOR = "/";
private int RepeatRegistrationInterval = -1;
private string baseUrl = null;
private int Timeout = -1;
private CancellationTokenSource RepeatRegistrationCancellationToken = null;
public void LoadSettings(RegistryClientSettings settings)
{
LoadProxy(settings.ProxyConfig);
if (settings.RegistryConfig.RepeatRegistration.HasValue)
RepeatRegistrationInterval = settings.RegistryConfig.RepeatRegistration.Value;
if (settings.ClientConfig.RequestConfig.RequestTimeout.HasValue)
Timeout = settings.ClientConfig.RequestConfig.RequestTimeout.Value;
else
Timeout = DEFAULT_REQUEST_TIMEOUT;
baseUrl = settings.RegistryConfig.RegistryUrl.TrimEnd('/') + PATH_SEPERATOR + REGISTRY_BASE_PATH;
}
public RegistryHttpClient() : this(null)
{ }
public RegistryHttpClient(RegistryClientSettings registryClientSettings)
{
Settings = registryClientSettings ?? RegistryClientSettings.LoadSettings();
Settings = Settings ?? throw new NullReferenceException("Settings is null");
LoadSettings(Settings);
JsonSerializerSettings = new DependencyInjectionJsonSerializerSettings();
}
public Uri GetUri(params string[] pathElements)
{
string path = baseUrl;
if (pathElements?.Length > 0)
foreach (var pathElement in pathElements)
{
string encodedPathElement = HttpUtility.UrlEncode(pathElement);
path = path.TrimEnd('/') + PATH_SEPERATOR + encodedPathElement.TrimEnd('/');
}
return new Uri(path);
}
public void RepeatRegistration(IAssetAdministrationShellDescriptor aasDescriptor, CancellationTokenSource cancellationToken)
{
RepeatRegistrationCancellationToken = cancellationToken;
Task.Factory.StartNew(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
IResult<IAssetAdministrationShellDescriptor> result = CreateOrUpdateAssetAdministrationShellRegistration(aasDescriptor.Identification.Id, aasDescriptor);
logger.Info("Registration-Renewal - Success: " + result.Success + " | Messages: " + result.Messages.ToString());
await Task.Delay(RepeatRegistrationInterval);
}
}, cancellationToken.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
public void CancelRepeatingRegistration()
{
RepeatRegistrationCancellationToken?.Cancel();
}
public IResult<IAssetAdministrationShellDescriptor> CreateOrUpdateAssetAdministrationShellRegistration(string aasId, IAssetAdministrationShellDescriptor aasDescriptor)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IAssetAdministrationShellDescriptor>(new ArgumentNullException(nameof(aasId)));
if (aasDescriptor == null)
return new Result<IAssetAdministrationShellDescriptor>(new ArgumentNullException(nameof(aasDescriptor)));
var request = base.CreateJsonContentRequest(GetUri(aasId), HttpMethod.Put, aasDescriptor);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse<IAssetAdministrationShellDescriptor>(response, response.Entity);
}
public IResult<IAssetAdministrationShellDescriptor> RetrieveAssetAdministrationShellRegistration(string aasId)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IAssetAdministrationShellDescriptor>(new ArgumentNullException(nameof(aasId)));
var request = base.CreateRequest(GetUri(aasId), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse<IAssetAdministrationShellDescriptor>(response, response.Entity);
}
public IResult<IQueryableElementContainer<IAssetAdministrationShellDescriptor>> RetrieveAllAssetAdministrationShellRegistrations(Predicate<IAssetAdministrationShellDescriptor> predicate)
{
if (predicate == null)
return new Result<IQueryableElementContainer<IAssetAdministrationShellDescriptor>>(new ArgumentNullException(nameof(predicate)));
var request = base.CreateRequest(GetUri(), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
var result = base.EvaluateResponse<IEnumerable<IAssetAdministrationShellDescriptor>>(response, response.Entity);
if (!result.Success || result.Entity == null)
return new Result<IQueryableElementContainer<IAssetAdministrationShellDescriptor>>(result);
else
{
var foundItems = result.Entity.Where(w => predicate.Invoke(w));
return new Result<IQueryableElementContainer<IAssetAdministrationShellDescriptor>>(result.Success, foundItems?.AsQueryableElementContainer(), result.Messages);
}
}
public IResult<IQueryableElementContainer<IAssetAdministrationShellDescriptor>> RetrieveAllAssetAdministrationShellRegistrations()
{
var request = base.CreateRequest(GetUri(), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
var result = base.EvaluateResponse<IEnumerable<IAssetAdministrationShellDescriptor>>(response, response.Entity);
return new Result<IQueryableElementContainer<IAssetAdministrationShellDescriptor>>(result.Success, result.Entity?.AsQueryableElementContainer(), result.Messages);
}
public IResult DeleteAssetAdministrationShellRegistration(string aasId)
{
if (string.IsNullOrEmpty(aasId))
return new Result(new ArgumentNullException(nameof(aasId)));
if (RepeatRegistrationInterval > 0)
RepeatRegistrationCancellationToken?.Cancel();
var request = base.CreateRequest(GetUri(aasId), HttpMethod.Delete);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse(response, response.Entity);
}
public IResult<ISubmodelDescriptor> CreateOrUpdateSubmodelRegistration(string aasId, string submodelId, ISubmodelDescriptor submodelDescriptor)
{
if (string.IsNullOrEmpty(aasId))
return new Result<ISubmodelDescriptor>(new ArgumentNullException(nameof(aasId)));
if (string.IsNullOrEmpty(submodelId))
return new Result<ISubmodelDescriptor>(new ArgumentNullException(nameof(submodelId)));
if (submodelDescriptor == null)
return new Result<ISubmodelDescriptor>(new ArgumentNullException(nameof(submodelDescriptor)));
var request = base.CreateJsonContentRequest(GetUri(aasId, SUBMODEL_PATH, submodelId), HttpMethod.Put, submodelDescriptor);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse<ISubmodelDescriptor>(response, response.Entity);
}
public IResult<IQueryableElementContainer<ISubmodelDescriptor>> RetrieveAllSubmodelRegistrations(string aasId, Predicate<ISubmodelDescriptor> predicate)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(new ArgumentNullException(nameof(aasId)));
if (predicate == null)
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(new ArgumentNullException(nameof(predicate)));
var request = base.CreateRequest(GetUri(aasId, SUBMODEL_PATH), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
var result = base.EvaluateResponse<IEnumerable<ISubmodelDescriptor>>(response, response.Entity);
if (!result.Success || result.Entity == null)
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(result);
else
{
var foundItems = result.Entity.Where(w => predicate.Invoke(w));
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(result.Success, foundItems?.AsQueryableElementContainer(), result.Messages);
}
}
public IResult<IQueryableElementContainer<ISubmodelDescriptor>> RetrieveAllSubmodelRegistrations(string aasId)
{
if (string.IsNullOrEmpty(aasId))
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(new ArgumentNullException(nameof(aasId)));
var request = base.CreateRequest(GetUri(aasId, SUBMODEL_PATH), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
var result = base.EvaluateResponse<IEnumerable<ISubmodelDescriptor>>(response, response.Entity);
return new Result<IQueryableElementContainer<ISubmodelDescriptor>>(result.Success, result.Entity?.AsQueryableElementContainer(), result.Messages);
}
public IResult<ISubmodelDescriptor> RetrieveSubmodelRegistration(string aasId, string submodelId)
{
if (string.IsNullOrEmpty(aasId))
return new Result<ISubmodelDescriptor>(new ArgumentNullException(nameof(aasId)));
if (string.IsNullOrEmpty(submodelId))
return new Result<ISubmodelDescriptor>(new ArgumentNullException(nameof(submodelId)));
var request = base.CreateRequest(GetUri(aasId, SUBMODEL_PATH, submodelId), HttpMethod.Get);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse<ISubmodelDescriptor>(response, response.Entity);
}
public IResult DeleteSubmodelRegistration(string aasId, string submodelId)
{
if (string.IsNullOrEmpty(aasId))
return new Result(new ArgumentNullException(nameof(aasId)));
if (string.IsNullOrEmpty(submodelId))
return new Result(new ArgumentNullException(nameof(submodelId)));
var request = base.CreateRequest(GetUri(aasId, SUBMODEL_PATH, submodelId), HttpMethod.Delete);
var response = base.SendRequest(request, Timeout);
return base.EvaluateResponse(response, response.Entity);
}
}
}